/*
 * @Description: 全局请求配置
 * @Author: Xiaowen丶
 * @Date: 2020-03-11 17:00:00
 * @LastEditors  : Xiaowen丶
 * @LastEditTime : 2020-03-11 17:00:00
 */
import Axios from 'axios';                              // 引入axios数据请求模块
import router from '@/router/index';                     // 引入项目路由文件
import { Toast } from 'vant';
// import store from '@/vuex/store';                       // 引入Vuex状态管理
import { getToken, removeToken } from '@/utils/common/auth'

/**
 *S101(511,"用户信息错误或未在我站签约建档，是否前往申请建档"),

    S102(512,"该用户已存在入住记录，请确认"),

    S103(513,"平台不存在此老人"),

    S104(514,"平台不存在此医生"),

    S105(515,"暂无关联慢病人员"),

    S106(516,"取件码错误"),

    S107(517,"该记录不存在"),

    S108(518,"该老人存在多个模板"),

    S109(519,"证件已存在"),

    S110(520,"无效验证码"),

    S111(521,"此token已失效，请重新登陆"),

    S112(522,"身份证号有误，请核对"),

    S113(523,"家庭账号绑定成功"),
    /**
     * 系统级问题
     */

    // S202(6002,"系统错误，请联系管理员"),

    // S203(6003,"文件格式不正确"),

    // S204(6004,"文件上传成功"),

    // S205(6005,"上传失败sheet为空"),

    // S206(6006,"传入参数有误"),

    // S207(6007,"识别失败，请重试"),

    // S299(6999,"");
let codes = [200,400,511,521,523] // 无需toast提示 
// 错误处理
const error_handle = (error) => {
    //如果是401则跳转到登录页面
    if (error.response.status === 401) {
        if (getToken()) {
            removeToken()
        }
        router.push({ path: "/" });
    }
    let message = error.response.data.message || error.response.data.msg || error.response.data.error_description || '未知错误'
    if (!codes.includes(error.response.status)) {
        Toast.fail(message);
        return Promise.reject(message)
    }
    // 通过返回的状态码对错误进行处理
}

// Axios全局配置
Axios.defaults.timeout = 30000;                         // 请求的过期时间30秒

if (process.env.NODE_ENV == 'development') {            // 开发模式
    // Axios.defaults.baseURL = '/api'; // /api 该配置可自行修改，必须与config文件下的index.js下的proxyTable中配置的一致
} else {                                                // 生产模式
    // Axios.defaults.baseURL = 'https://mechc.healthyj.cn';
}
// http request 请求拦截器
Axios.interceptors.request.use(config => {
    // 设置请求头
    // config.withCredentials = true // 允许在请求头中携带token ,这个是解决跨域产生的相关问题
    // config.headers['access-token']: '' // 设置请求头中的access-token
    return config;
}, error => {
    return Promise.reject(error);
});

// http response 响应拦截器
Axios.interceptors.response.use(response => {
    const status = response.data.code || 200;
    const message = response.data.message || response.data.msg || response.data.error_description || '未知错误';
    //如果是401则跳转到登录页面
    if (status === 401) {
        if (getToken()) {
            removeToken()
        }
        router.push({ path: "/" });
    }
    // 如果请求为非200否者默认统一处理
    if (!codes.includes(status)) {
        Toast.fail(message);
        return Promise.reject(message)
    }
    return response;
}, error => {
    error_handle(error);
    return Promise.reject(error);
});

export default Axios;